Utilisation avancée
(Non-)resoumission automatique de job
Lors de la défaillance d'un nœud de calcul, les jobs calculant sur ce nœud sont automatiquement arrêtés puis resoumis par Slurm.
Si vous ne voulez pas que vos jobs soient automatiquement resoumis vous devez rajouter l'option suivante à votre fichier de soumission :
#SBATCH --no-requeue
Envoi et interception de signaux par un timer
Il est parfois nécessaire d'effectuer une action (sauvegarde, checkpoint, etc.) avant d'atteindre le timeout d'un job.
Pour cela, ajoutez la ligne
#SBATCH --signal ... et la commande trap à votre fichier de soumission afin d'intercepter le signal qui sera envoyé par le timer :
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --time=01:00:00
#SBATCH --job-name=my_job
#SBATCH --mem=1G
#SBATCH --signal=B:SIGUSR1@120
trap "./my_end_command" SIGUSR1
./my_job_program
La syntaxe de l'option --signal est la suivante : --signal=B:SIGUSR1@TIME
Avec cette option Slurm enverra le signal SIGUSR1 au shell, TIME secondes (entre 0 et 65535) avant la fin du walltime.
Notez qu'il peut y avoir une incertitude de 60 secondes d'après la documentation de Slurm.
La commande à exécuter à la réception du signal SIGUSR1 est définie par la commande trap "./my_end_command" SIGUSR1.
Cette commande doit être placée avant d'exécuter la commande principal du job (./my_job_program).
Par exemple :
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --time=00:02:00
#SBATCH --job-name=my_job
#SBATCH --mem=1G
#SBATCH --signal=B:SIGUSR1@10
trap "date > before-end-of-job-$SLURM_JOB_ID.txt" SIGUSR1
sleep 118
date > end-of-job-$SLURM_JOB_ID.txt
Dans cet exemple :
- Le job a un walltime de 2 minutes
- Le signal SIGUSR1 sera émis 10 secondes avant la fin
- A réception du signal, la date sera enregistrée dans un fichier
before-end-of-job-<jobid>.txt - Le déroulement normal du job est le suivant : on attend 1m58 (118 secondes) puis on enregistre la date dans un fichier
end-of-job-<jobid>.txt
Dépendances et chaînage de jobs
Si vous souhaitez soumettre deux jobs qui se chaînent, par exemple job1 et job2 avec job2 qui attend la fin de job1 avant de s'éxécuter, l'option --dependency peut vous aider.
Tout d'abord, soumettez votre premier job à l'aide de la commande sbatch :
sbatch job1.slurm
Récupérez le job ID renvoyé par la commande sbatch (appelons-le jobid1) puis lancez votre seconde job avec l'option --dependency :
sbatch --dependency=afterany:jobid1 job2.slurm
Le mot clé afterany signifie que le second job doit se lancer qu'il y ait eu une erreur ou non sur le premier job.
Pour soumettre des chaînes de jobs plus complexes, consultez --dependency ou le manuel:
man sbatch